import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
# import statsmodels.api as sm
import numpy.random as npr

# 设置中文字体的显示
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
data2 = pd.read_csv('data2.csv', index_col="Date")
data2.index = [dt.datetime.strptime(x, "%Y-%m-%d") for x in data2.index]

# 对数收益率
log_returns = np.log(data2.pct_change() + 1)
# 蒙特卡罗采样10000个观测点
number = 10000
stock_num = len(log_returns.columns)

# 用现实数据采用蒙特卡罗方法模拟出更多的数据来测量
# 0-1之间均匀分布的函数
weights = npr.rand(number, stock_num)
# print(weights.shape)
# 每期的投资组合权重
weights /= np.sum(weights, axis=1).reshape(number, 1)
# 就散样本均值
# print(log_returns.mean())
# 计算协方差矩阵，这里含有方差数据
# print(log_returns.cov())
# quit()
# 计算年化收益，这里是用期望值
# 这里之所以要乘以252是因为一年中有252个交易日，我们表格中的数据时单日的收益
prets = np.dot(weights, log_returns.mean()) * 252
# 计算年化风险，这里是用方差，sqrt是开平方的意思，diag是获取对角线的数据
pvols = np.diag(
    np.sqrt(np.dot(weights, np.dot(log_returns.cov() * 252, weights.T))))
plt.figure(figsize=(10, 6))
plt.scatter(pvols, prets, c=prets / pvols, marker='o')
plt.grid(True)
plt.xlabel("预测波动率")
plt.ylabel("预期收益率")
plt.colorbar(label="夏普率")
plt.show()
